const express=require('express');
const uuidv1 = require('uuid/v1');//生成不重复字符串
const formidable = require('formidable');//表单上传插件
const fs = require('fs');
const user = require('./js/user');
const admin = require('./js/admin');
const config=require('./config');
const app = express();
const bodyParser = require('body-parser');
const querystring = require('querystring');//测试
const history = require('connect-history-api-fallback');

app.use('/static', express.static(__dirname+'/public/views/static'));
app.use(express.static(__dirname+'/public'));
app.use(bodyParser.urlencoded({limit: '1mb', extended: true}));
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json());
app.use(history());

app.set('views', __dirname + '/public/views');
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');  

app.use( function(req, res, next) {
    res.header("Access-Control-Allow-Origin",*);
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By",' 3.2.1')
    res.header("Content-Type", "application/json;charset=utf-8");
    if (req.method == "OPTIONS"){
    	res.send(200);
    } else{
    	next();
    }  
});

//前台首页，返回所有文章的标题、分类、阅读量、_id
app.get('/forestage/home', function (req, res) {
    user.getAllArticle({}).then(function(val) {
        val.forEach(function(v){
            delete v.markdown;
            v.html=v.html.slice(0,1000);
        });
        res.status(200).send(JSON.stringify(val));
        res.end();
    }, function(err) {
    	res.status(500).send(JSON.stringify('服务器故障'));
        res.end();
    });
});

//前台某一篇文章，返回文章的标题、分类、阅读量、_id、html
app.get('/forestage/home/:id', function (req, res) {
    user.getSomeArticle({_id:req.params.id})
    .then(function(val) {
        res.status(200).send(JSON.stringify(val));
        res.end();
    }, function(err) {
        res.status(200).send(JSON.stringify(err));
        res.end();
    });
});

//前台分类，返回分类、分类下的文章标题、阅读量
app.get('/forestage/categories', function (req, res) {
    user.getArticleCategories()
    .then(function(val) {
        res.status(200).send(JSON.stringify(val));
        res.end();
    }, function(err) {
        res.end();
    });
});

//前台分类下的文章、返回文章的标题、分类、阅读量、_id、html
app.get('/forestage/categories/:tag/:id', function (req, res) {
    user.getSomeArticle({_id:req.params.id})
    .then(function(val) {
        res.status(200).send(JSON.stringify(val));
        res.end();
    }, function(err) {
        res.status(200).send(JSON.stringify(err));
        res.end();
    });
});

//前台分类下的文章、返回文章的标题、分类、阅读量、_id、html
app.get('/forestage/aboutme', function (req, res) {
    user.getAboutme()
    .then(function(val) {
    	res.status(200).send(JSON.stringify({html:val.html}));
        res.end();
    }, function(err) {
    	res.status(200).send(JSON.stringify(err));
        res.end();
    });
});

//后台登录，登录成功返回true，失败false
app.get('/admin/login', function (req, res) {
    admin.checkUsernamePassword({userName:req.query.userName,password:req.query.password})
    .then(function(val) {
        const sessionID = uuidv1();
        admin.updateSessionID(sessionID).then(function(val){
            res.end(sessionID);
        },function(err){
            res.end(JSON.stringify(false));
        });
    }, function(err) {
        res.end(JSON.stringify(false));
    });
});

//后台验证session，匹配返回true，不匹配返回false
app.get('/admin/checkLogin', function (req, res) {
    admin.checkSessionID(req.query.sessionID)
    .then(function(val) {
        res.end(JSON.stringify(val));
    }, function(err) {
        res.end(JSON.stringify(err));
    });
});

//后台主页，返回文章标题、分类、阅读量、_id
app.get('/admin/home', function (req, res) {
    admin.checkSessionID(req.query.sessionID)
    .then(function(val) {
        admin.getAllArticle({}).then(function(val) {
        val.forEach(function(v){
            delete v.html;
            delete v.markdown;
            v.tags = v.tags.join(',');
        });
        res.status(200).send(JSON.stringify(val));
        res.end();
        }, function(err) {
            res.end(JSON.stringify(err));
        });
    }, function(err) {
        res.end(JSON.stringify(err));
    });
});

//后台某一篇文章、返回标题、分类、阅读量、_id、html
app.get('/admin/home/:id', function (req, res) {
    admin.checkSessionID(req.query.sessionID)
    .then(function(val) {
        admin.getSomeArticle({_id:req.params.id}).then(function(val) {
        delete val.markdown;
        res.status(200).send(JSON.stringify(val));
        res.end();
        }, function(err) {
            res.end(JSON.stringify(false));
        });
    }, function(err) {
        res.end(JSON.stringify(false));
    });
});

//后台修改某一篇文章，返回标题、分类、markdown、html、_id
app.get('/admin/home/modify/:id', function (req, res) {
    admin.checkSessionID(req.query.sessionID)
    .then(function(val) {
        admin.getSomeArticle({_id:req.params.id}).then(function(val) {
        val.tags = val.tags.join(',');
        res.write(JSON.stringify(val));
        res.end();
        }, function(err) {
            res.end(JSON.stringify(false));
        });
    }, function(err) {
        res.end(JSON.stringify(false));
    });
});

//后台提交一篇修改之后的文章，成功返回true、失败返回fanlse
app.post('/admin/modify', function (req, res) {
    admin.checkSessionID(req.body.sessionID)
    .then(function(val) {
        admin.updateArticle(req.body).then(function(val) {
            res.end(JSON.stringify(true));
        }, function(err) {
            res.end(JSON.stringify(false));
        });
    }, function(err) {
        res.end(JSON.stringify(false));
    });
});

//后台删除一篇文章，成功返回true,失败返回false
app.get('/admin/deletearticle', function (req, res) {
    admin.checkSessionID(req.query.sessionID)
    .then(function(val) {
        admin.deleteArticle(req.query._id).then(function(val) {
            res.end(JSON.stringify(val));
        }, function(err) {
            res.end(JSON.stringify(err));
        });
    }, function(err) {
        res.end(JSON.stringify(err));
    });
});

//后台添加一篇文章，成功返回true，失败返回false
app.post('/admin/addarticle', function (req, res) {
    admin.checkSessionID(req.body.sessionID)
    .then(function(val) {
        admin.addArticle(req.body).then(function(val) {
            res.end(JSON.stringify(true));
        }, function(err) {
            res.end(JSON.stringify(false));
        });
    }, function(err) {
        res.end(JSON.stringify(false));
    });
});

//后台上传图片
app.post('/admin/image', function (req, res) {
    admin.checkSessionID(req.query.sessionID)
    .then(function(val) {
        const form = new formidable.IncomingForm();
        form.uploadDir = __dirname+'/public/images';
        form.keepExtensions = true;
        let dirName=__dirname+'/public/';
        form.parse(req, function(err, fields, files) {
            res.end('http://139.199.194.142:80/'+files.image.path.replace(dirName,''));
        });
    },function(err){
        res.end(JSON.stringify(false));
    })
});

app.post('/admin/publishdraft', function (req, res) {
    admin.checkSessionID(req.body.sessionID)
    .then(function(val) {
        admin.addArticle(req.body).then(function(val) {
            admin.deleteDraft(req.body._id).then(function(result){
                res.end(JSON.stringify(true));
            },function(err){
                res.end(JSON.stringify(false));
            })
        }, function(err) {
            res.end(JSON.stringify(false));
        });
    }, function(err) {
        res.end(JSON.stringify(false));
    });
});

//后台提交一篇草稿，成功返回true，失败返回false
app.post('/admin/adddraft', function (req, res) {
    admin.checkSessionID(req.body.sessionID)
    .then(function(val) {
        admin.adddraft(req.body).then(function(val) {
            res.end(JSON.stringify(true));
        }, function(err) {
            res.end(JSON.stringify(false));
        });
    }, function(err) {
        res.end(JSON.stringify(false));
    });
});

//后台提交一篇草稿到草稿，成功返回true，失败返回false
app.post('/admin/drafttodraft', function (req, res) {
    admin.checkSessionID(req.body.sessionID)
    .then(function(val) {
        admin.adddraft(req.body).then(function(val) {
            admin.deleteDraft(req.body._id).then(function(result){
                res.end(JSON.stringify(true));
            },function(err){
                res.end(JSON.stringify(false));
            })
        }, function(err) {
            res.end(JSON.stringify(false));
        });
    }, function(err) {
        res.end(JSON.stringify(false));
    });
});

//后台获取草稿，返回草稿的标题、分类
app.get('/admin/drafts', function (req, res) {
    admin.checkSessionID(req.query.sessionID)
    .then(function(val) {
        admin.getAllDraft({}).then(function(val) {
        val.forEach(function(v){
            delete v.markdown;
            v.tags = v.tags.join(',');
        });
        res.status(200).send(JSON.stringify(val));
        res.end();
        }, function(err) {
            res.end(JSON.stringify(err));
        });
    }, function(err) {
        res.end(JSON.stringify(err));
    });
});

//后台获取某一篇草稿，返回草稿标题、markdown、分类
app.get('/admin/drafts/:id', function (req, res) {
    admin.checkSessionID(req.query.sessionID)
    .then(function(val) {
        admin.getSomeDraft({_id:req.params.id}).then(function(val) {
        val.tags = val.tags.join(',');
        res.status(200).send(JSON.stringify(val));
        res.end();
        }, function(err) {
            res.end(JSON.stringify(false));
        });
    }, function(err) {
        res.end(JSON.stringify(false));
    });
});

//后台删除一篇草稿，返回true或false
app.get('/admin/deletedraft', function (req, res) {
    admin.checkSessionID(req.query.sessionID)
    .then(function(val) {
        admin.deleteDraft(req.query._id).then(function(val) {
        res.status(200).send(JSON.stringify(val));
        res.end();
        }, function(err) {
            res.end(JSON.stringify(false));
        });
    }, function(err) {
        res.end(JSON.stringify(false));
    });
});

//后台提交个人信息，成功返回true，失败返回false
app.post('/admin/aboutme', function (req, res) {
    admin.checkSessionID(req.body.sessionID)
    .then(function(val) {
        admin.setAboutme(req.body).then(function(val) {
            res.end(JSON.stringify(true));
        }, function(err) {
            res.end(JSON.stringify(false));
        });
    }, function(err) {
        res.end(JSON.stringify(false));
    });
});

//后台请求个人信息，成功返回true，失败返回false
app.get('/admin/aboutme', function (req, res) {
    admin.checkSessionID(req.query.sessionID)
    .then(function(val) {
        admin.getAboutme().then(function(success) {
            res.end(JSON.stringify({markdown:success.markdown}));
        }, function(err) {
            res.end(JSON.stringify(false));
        });
    }, function(err) {
        res.end(JSON.stringify(false));
    });
});

//后台修改账号密码，成功返回true，失败返回false
app.post('/admin/changeup', function (req, res) {
    admin.checkSessionID(req.body.sessionID)
    .then(function(val) {
        admin.changeUP(req.body).then(function(val) {
            const sessionID = uuidv1();
            admin.updateSessionID(sessionID).then(function(val){
                res.end(JSON.stringify(true));
            },function(err){
                res.end(JSON.stringify(false));
            });
        }, function(err) {
            res.end(JSON.stringify(false));
        });
    }, function(err) {
        res.end(JSON.stringify(false));
    });
});

//后台修改头像成功返回true，失败返回false
app.post('/admin/avatar', function (req, res) {
    admin.checkSessionID(req.query.sessionID)
    .then(function(val) {
        const imgData=req.body.data;
        let base64Data = imgData.replace(/^data:image\/\w+;base64,/, "");
        var dataBuffer = new Buffer(base64Data, 'base64');
        fs.writeFile(__dirname+'/public/images/avatar.png', dataBuffer, function(err) {
            if(!err){
            	res.end(JSON.stringify(true));
            }else{
            	res.end(JSON.stringify(false));
            }
        });
    }, function(err) {
        res.end(JSON.stringify(false));
    })
});

app.all('/*',function(req,res,next){
	res.header('Content-Type','text/html');
	if(req.originalUrl.substring(0,6)!=='/admin'){
		res.render('index.html');
	}else{
		res.render('admin.html');
	}
	next();
	
});

app.listen(80, function () {
  console.log('myblog listening on port 80!');
});
